public class IsUnique {
    public boolean isUnique1(String astr) {
        // 利用鸽巢原理进行优化
        if(astr.length() > 26) {
            return false;
        }

        char[] ch = astr.toCharArray();
        int[] hash = new int[26];
        for(char c : ch) {
            hash[c - 'a']++;
        }

        for(int x : hash) {
            if(x >= 2) {
                // 出现次数达到2及以上, 返回 false
                return false;
            }
        }
        return true;
    }

    public boolean isUnique(String astr) {
        // 鸽巢原理优化
        if(astr.length() > 26) {
            return false;
        }

        // 位图思想
        int bitMap = 0;
        for(int i = 0; i < astr.length(); i++) {
            // 拿到每个字符所在下标
            int x = astr.charAt(i) - 'a';
            if(((bitMap >> x) & 1) != 0) {
                // x 比特位是否为0, 不为 0 说明该字符有出现过, 现在多出现了一次
                return false;
            }else {
                // 为 0 说明没有出现过, 将该 bit 位修改成 1
                bitMap = (bitMap | (1 << x));
            }
        }
        return true;
    }
}
